package san.java.day09;

/**
 * 接口: 是抽象方法和常量值定义的集合. 只有方法定义而没有方法实现
 *  1. 使用接口, 就可以得到类似多重继承的效果
 *  2. 接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义, 而没有变量和方法的实现
 *  3. 一个类可以实现多个接口,接口也可以继承其他接口
 *
 *  接口的特点:
 *      1. 使用interface 定义
 *      2. 接口中所有的成员变量都是由 public static final 修饰的
 *      3. 接口中所有的方法都默认是由 public acstract修饰的
 *      4. 接口没有构造器
 *      5. 接口采用多层集成机制
 *
 *  接口与抽象类的区别: 接口表某项能力, 抽象类表示某个实体
 *      i  抽象类是对一类事物的高度抽象,其中既有属性也有方法;
 *      ii 接口是对方法的抽象,也就对一系列动作的抽象
 *
 *      1. 抽象类需要稳定,不能经常改动
 *      2. 接口满足了时时变动的需求,而不会影响原来的抽象父类,显示了一定程度的隔离
 *      3. 接口能满足实际的需求: 例如会唱歌的厨子是个老师
 *
 *  注意:
 *    1. 在类定义时,先写继承,在写implements
 *    2. 一个类可以实现多个无关的接口, 类可以向上转型为接口
 *    3. 与继承关系类似,接口与实现类之间存在多态性
 */

public class Interface_05 extends Dog implements Running, Swimming {
    @Override
    public void move() {
        System.out.println("狗跑...");
    }


    @Override
    public void swim() {
        System.out.println("狗刨...");
    }

    @Override
    public void run() {
        System.out.println("四只腿跑");
    }

    public static void main(String[] args) {
        Interface_05 dog = new Interface_05();
        dog.move();
        dog.run();
        dog.swim();

        /**
         * 与继承关系类似,接口与实现类之间存在多态性
         */
        Running running = new Interface_05();

        /**
         * 接口可以实例化
         */
        Swimming swim = new Swimming() {
            @Override
            public void swim() {
                System.out.println("游泳");
            }
        };

        // 匿名对象
        Animal animal = new Animal() {

            @Override
            public String getFood() {
                return null;
            }

            @Override
            public void move() {

            }
        };

        swim.swim();
        running.run();
    }
}
